home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2007 September / PCWSEP07.iso / Software / Linux / Linux Mint 3.0 Light / LinuxMint-3.0-Light.iso / casper / filesystem.squashfs / var / lib / dpkg / info / linux-image-2.6.20-15-generic.postinst < prev    next >
Encoding:
Text File  |  2007-04-15  |  48.3 KB  |  1,404 lines

  1. #! /usr/bin/perl
  2. #                              -*- Mode: Cperl -*-
  3. # debian.postinst ---
  4. # Author           : Manoj Srivastava ( srivasta@pilgrim.umass.edu )
  5. # Created On       : Sat Apr 27 05:55:26 1996
  6. # Created On Node  : melkor.pilgrim.umass.edu
  7. # Last Modified By : Manoj Srivastava
  8. # Last Modified On : Fri Sep 29 10:08:18 2006
  9. # Last Machine Used: glaurung.internal.golden-gryphon.com
  10. # Update Count     : 357
  11. # Status           : Unknown, Use with caution!
  12. # HISTORY          :
  13. # Description      :
  14. #
  15. #    $Id: image.postinst,v 1.125 2003/10/07 16:24:20 srivasta Exp $
  16. #
  17.  
  18. #
  19. #use strict; #for debugging
  20. use Cwd 'abs_path';
  21. use Debconf::Client::ConfModule qw(:all);
  22. version('2.0');
  23. my $capb=capb("backup");
  24.  
  25. $|=1;
  26.  
  27. # Predefined values:
  28. my $version           = "2.6.20-15-generic";
  29. my $link_in_boot      = "";  # Should be empty, mostly
  30. my $no_symlink        = "";   # Should be empty, mostly
  31. my $reverse_symlink   = "";   # Should be empty, mostly
  32. my $do_symlink        = "Yes";  # target machine defined
  33. my $do_boot_enable    = "Yes";  # target machine defined
  34. my $do_bootfloppy     = "Yes";  # target machine defined
  35. my $do_bootloader     = "Yes";  # target machine defined
  36. my $move_image        = '';     # target machine defined
  37. my $kimage            = "bzImage";   # Should be empty, mostly
  38. my $loader            = "lilo"; # lilo, silo, quik, palo, vmelilo, nettrom, arcboot or delo
  39. my $image_dir         = "/boot";        # where the image is located
  40. my $clobber_modules   = '';          # target machine defined
  41. my $relative_links    = "";          # target machine defined
  42. my $initrd            = "YES";        # initrd kernel
  43. my $mkimage           = "";   # command to generate the initrd image
  44. my $do_initrd         = '';     # Normally we do not
  45. my $warn_initrd       = 'YES';  # Normally we do
  46. my $use_hard_links    = ''; # hardlinks do not work across fs boundaries
  47. my $postinst_hook     = '';          #Normally we do not
  48. my $postrm_hook       = '';          #Normally we do not
  49. my $preinst_hook      = '';          #Normally we do not
  50. my $prerm_hook        = '';          #Normally we do not
  51. my $minimal_swap      = '';          # Do not swap symlinks
  52. my $ignore_depmod_err = '';          # normally we do not
  53. my $relink_src_link   = 'YES'; # There is no harm in checking the link
  54. my $relink_build_link = 'YES'; # There is no harm in checking the link
  55. my $force_build_link  = '';    # There is no harm in checking the link
  56. my $official_image    = "YES";  # only true for official images
  57. my $arch              = "i386"; #  should be same as dpkg --print-installation-architecture
  58. my $kernel_arch       = "i386";
  59. my $ramdisk           = "mkinitramfs-kpkg mkinitrd.yaird";  # List of tools to create initial ram fs.
  60. my $initrddep         = "initramfs-tools (>= 0.53) | yaird (>= 0.0.11) | linux-initramfs-tool, ";  # List of dependencies for such tools
  61. my $update_initramfs  = "/usr/sbin/update-initramfs";
  62. my $notifier          = "/usr/share/update-notifier/notify-reboot-required";
  63. my $package_name      = "linux-image-$version";
  64. my $explicit_do_loader = 'Yes';
  65.  
  66. $ramdisk = $update_initramfs if (-x $update_initramfs);
  67.  
  68. my $Loader          = "NoLOADER"; #
  69. $Loader             = "LILO"     if $loader =~ /^lilo/io;
  70. $Loader             = "SILO"     if $loader =~ /^silo/io;
  71. $Loader             = "QUIK"     if $loader =~ /^quik/io;
  72. $Loader             = "yaboot"   if $loader =~ /^yaboot/io;
  73. $Loader             = "PALO"     if $loader =~ /^palo/io;
  74. $Loader             = "NETTROM"  if $loader =~ /^nettrom/io;
  75. $Loader             = "VMELILO"  if $loader =~ /^vmelilo/io;
  76. $Loader             = "ZIPL"     if $loader =~ /^zipl/io;
  77. $Loader             = "ELILO"    if $loader =~ /^elilo/io;
  78. $Loader             = "ARCBOOT"  if $loader =~ /^arcboot/io;
  79. $Loader             = "DELO"     if $loader =~ /^delo/io;
  80.  
  81. # This should not point to /tmp, because of security risks.
  82. my $temp_file_name = "/var/log/$loader" . "_log.$$";
  83.  
  84. #known variables
  85. my $image_dest      = "/";
  86. my $realimageloc    = "/$image_dir/";
  87. my $have_conffile   = "";
  88. my $silent_modules  = '';
  89. my $silent_loader   = '';
  90. my $warn_reboot     = 'Yes';     # Warn that we are installing a version of
  91.                                  # the kernel we are running
  92.  
  93. my $modules_base    = '/lib/modules';
  94. my $CONF_LOC        = '/etc/kernel-img.conf';
  95.  
  96. # Ignore all invocations except when called on to configure.
  97. exit 0 unless $ARGV[0] =~ /configure/;
  98.  
  99. my $DEBUG = 0;
  100.  
  101. # Do some preliminary sanity checks here to ensure we actually have an
  102. # valid image dir
  103. chdir('/')           or die "could not chdir to /:$!\n";
  104. die "Internal Error: ($image_dir) is not a directory!\n"
  105.   unless -d $image_dir;
  106.  
  107. # remove multiple leading slashes; make sure there is at least one.
  108. $realimageloc  =~ s|^/*|/|o;
  109. $realimageloc  =~ s|/+|/|o;
  110. die "Internal Error: ($realimageloc) is not a directory!\n"
  111.   unless -d $realimageloc;
  112.  
  113. if (-r "$CONF_LOC" && -f "$CONF_LOC"  ) {
  114.   if (open(CONF, "$CONF_LOC")) {
  115.     while (<CONF>) {
  116.       chomp;
  117.       s/\#.*$//g;
  118.       next if /^\s*$/;
  119.  
  120.       $do_symlink      = "" if /do_symlinks\s*=\s*(no|false|0)\s*$/ig;
  121.       $no_symlink      = "" if /no_symlinks\s*=\s*(no|false|0)\s*$/ig;
  122.       $reverse_symlink = "" if /reverse_symlink\s*=\s*(no|false|0)\s*$/ig;
  123.       $link_in_boot    = "" if /image_in_boot\s*=\s*(no|false|0)\s*$/ig;
  124.       $link_in_boot    = "" if /link_in_boot\s*=\s*(no|false|0)\s*$/ig;
  125.       $move_image      = "" if /move_image\s*=\s*(no|false|0)\s*$/ig;
  126.       $clobber_modules = '' if /clobber_modules\s*=\s*(no|false|0)\s*$/ig;
  127.       $do_boot_enable  = '' if /do_boot_enable\s*=\s*(no|false|0)\s*$/ig;
  128.       $do_bootfloppy   = '' if /do_bootfloppy\s*=\s*(no|false|0)\s*$/ig;
  129.       $relative_links  = '' if /relative_links \s*=\s*(no|false|0)\s*$/ig;
  130.       $do_bootloader   = '' if /do_bootloader\s*=\s*(no|false|0)\s*$/ig;
  131.       $explicit_do_loader = '' if /do_bootloader\s*=\s*(no|false|0)\s*$/ig;
  132.       $do_initrd       = '' if /do_initrd\s*=\s*(no|false|0)\s*$/ig;
  133.       $warn_initrd     = '' if /warn_initrd\s*=\s*(no|false|0)\s*$/ig;
  134.       $use_hard_links  = '' if /use_hard_links\s*=\s*(no|false|0)\s*$/ig;
  135.       $silent_modules  = '' if /silent_modules\s*=\s*(no|false|0)\s*$/ig;
  136.       $silent_loader   = '' if /silent_loader\s*=\s*(no|false|0)\s*$/ig;
  137.       $warn_reboot     = '' if /warn_reboot\s*=\s*(no|false|0)\s*$/ig;
  138.       $minimal_swap    = '' if /minimal_swap\s*=\s*(no|false|0)\s*$/ig;
  139.       $ignore_depmod_err = '' if /ignore_depmod_err\s*=\s*(no|false|0)\s*$/ig;
  140.       $relink_src_link   = '' if /relink_src_link\s*=\s*(no|false|0)\s*$/ig;
  141.       $relink_build_link = '' if /relink_build_link\s*=\s*(no|false|0)\s*$/ig;
  142.       $force_build_link  = '' if /force_build_link\s*=\s*(no|false|0)\s*$/ig;
  143.  
  144.       $do_symlink      = "Yes" if /do_symlinks\s*=\s*(yes|true|1)\s*$/ig;
  145.       $no_symlink      = "Yes" if /no_symlinks\s*=\s*(yes|true|1)\s*$/ig;
  146.       $reverse_symlink = "Yes" if /reverse_symlinks\s*=\s*(yes|true|1)\s*$/ig;
  147.       $link_in_boot    = "Yes" if /image_in_boot\s*=\s*(yes|true|1)\s*$/ig;
  148.       $link_in_boot    = "Yes" if /link_in_boot\s*=\s*(yes|true|1)\s*$/ig;
  149.       $move_image      = "Yes" if /move_image\s*=\s*(yes|true|1)\s*$/ig;
  150.       $clobber_modules = "Yes" if /clobber_modules\s*=\s*(yes|true|1)\s*$/ig;
  151.       $do_boot_enable  = "Yes" if /do_boot_enable\s*=\s*(yes|true|1)\s*$/ig;
  152.       $do_bootfloppy   = "Yes" if /do_bootfloppy\s*=\s*(yes|true|1)\s*$/ig;
  153.       $do_bootloader   = "Yes" if /do_bootloader\s*=\s*(yes|true|1)\s*$/ig;
  154.       $explicit_do_loader = "YES" if /do_bootloader\s*=\s*(yes|true|1)\s*$/ig;
  155.       $relative_links  = "Yes" if /relative_links\s*=\s*(yes|true|1)\s*$/ig;
  156.       $do_initrd       = "Yes" if /do_initrd\s*=\s*(yes|true|1)\s*$/ig;
  157.       $warn_initrd     = "Yes" if /warn_initrd\s*=\s*(yes|true|1)\s*$/ig;
  158.       $use_hard_links  = "Yes" if /use_hard_links\s*=\s*(yes|true|1)\s*$/ig;
  159.       $silent_modules  = 'Yes' if /silent_modules\s*=\s*(yes|true|1)\s*$/ig;
  160.       $silent_loader   = 'Yes' if /silent_loader\s*=\s*(yes|true|1)\s*$/ig;
  161.       $warn_reboot     = 'Yes' if /warn_reboot\s*=\s*(yes|true|1)\s*$/ig;
  162.       $minimal_swap    = 'Yes' if /minimal_swap\s*=\s*(yes|true|1)\s*$/ig;
  163.       $ignore_depmod_err = 'Yes' if /ignore_depmod_err\s*=\s*(yes|true|1)\s*$/ig;
  164.       $relink_src_link   = 'Yes' if /relink_src_link\s*=\s*(yes|true|1)\s*$/ig;
  165.       $relink_build_link = 'Yes' if /relink_build_link\s*=\s*(yes|true|1)\s*$/ig;
  166.       $force_build_link = 'Yes' if /force_build_link\s*=\s*(yes|true|1)\s*$/ig;
  167.  
  168.       $image_dest      = "$1"  if /image_dest\s*=\s*(\S+)/ig;
  169.       $postinst_hook   = "$1"  if /postinst_hook\s*=\s*(\S+)/ig;
  170.       $postrm_hook     = "$1"  if /postrm_hook\s*=\s*(\S+)/ig;
  171.       $preinst_hook    = "$1"  if /preinst_hook\s*=\s*(\S+)/ig;
  172.       $prerm_hook      = "$1"  if /prerm_hook\s*=\s*(\S+)/ig;
  173.       $mkimage         = "$1"  if /mkimage\s*=\s*(.+)$/ig;
  174.       $ramdisk         = "$1"  if /ramdisk\s*=\s*(.+)$/ig;
  175.     }
  176.     close CONF;
  177.     $have_conffile = "Yes";
  178.   }
  179. }
  180.  
  181.  
  182.  
  183. # For some versions of kernel-package, we had this warning in the
  184. # postinst, but the rules did not really interpolate the value in.
  185. # Here is a sanity check.
  186. my $pattern = "=" . "I";
  187. $initrd=~ s/^$pattern$//;
  188.  
  189. if ($link_in_boot) {
  190.   $image_dest = "/$image_dir/"; # same as realimageloc
  191. }
  192.  
  193. # Tack on at least one trainling /
  194. $image_dest = "$image_dest/";
  195. $image_dest =~ s|^/*|/|o;
  196. $image_dest =~ s|/+$|/|o;
  197.  
  198. if (! -d "$image_dest") {
  199.   die "Expected Image Destination dir ($image_dest) to be a valid directory!\n";
  200. }
  201.  
  202. # sanity
  203. if (!($do_bootfloppy || $do_bootloader)) {
  204.   $do_boot_enable = '';
  205. }
  206. if ($do_symlink && $no_symlink) {
  207.   warn "Both do_symlinks and no_symlinks options enabled; disabling no_symlinks\n";
  208.   $no_symlink = 0;
  209. }
  210.  
  211. # most of our work is done in $image_dest (nominally /)
  212. chdir("$image_dest") or die "could not chdir to $image_dest:$!\n";
  213.  
  214. # Paranoid check to make sure that the correct value is put in there
  215. if    (! $kimage)                 { $kimage = "vmlinuz"; } # Hmm. empty
  216. elsif ($kimage =~ m/^b?zImage$/o) { $kimage = "vmlinuz"; } # these produce vmlinuz
  217. elsif ($kimage =~ m/^[iI]mage$/o) { my $nop = $kimage;   }
  218. elsif ($kimage =~ m/^vmlinux$/o)  { my $nop = $kimage;   }
  219. else                              { $kimage = "vmlinuz"; } # Default
  220.  
  221. $ENV{KERNEL_ARCH}=$kernel_arch if $kernel_arch;
  222.  
  223.  
  224. die "Internal Error: Could not find image (" . $realimageloc
  225.   . "$kimage-$version)\n" unless -e $realimageloc
  226.   . "$kimage-$version";
  227.  
  228. # search for the boot loader in the path
  229. my $loader_exec;
  230. ($loader_exec = $loader)  =~ s|.*/||;
  231. my ($loaderloc) = grep -x, map "$_/$loader_exec",
  232.   map { length($_) ? $_ : "." }  split /:/, $ENV{PATH};
  233.  
  234.  
  235. ######################################################################
  236. ## Fix the build link
  237. ######################################################################
  238. sub fix_build_link {
  239.   return unless -d "$modules_base/$version";
  240.   # if we saved a build link in preinst, restore the link
  241.   if (! -e "$modules_base/$version/build" && 
  242.       -l "$modules_base/$version/build.save" ) {
  243.     rename("$modules_base/$version/build.save", "$modules_base/$version/build") ||
  244.       die "failed to move $modules_base/$version/build:$!";
  245.   }
  246.   if ($relink_build_link || $force_build_link) {
  247.     my $build_target;
  248.     my $real_target = '';
  249.     if (-l "$modules_base/$version/build") {
  250.       $build_target = readlink "$modules_base/$version/build";
  251.     } else {
  252.       return;
  253.     }
  254.     # Determine what the real file name is, and test that for existence
  255.     $real_target = abs_path($build_target) if defined($build_target);
  256.     if (!defined($build_target) || ! -d "$real_target") { # Danglink link
  257.       warn qq(
  258.  Hmm. There is a symbolic link $modules_base/$version/build
  259.  However, I can not read it: $!
  260.  Therefore, I am deleting $modules_base/$version/build\n
  261. );
  262.       my $num = unlink "$modules_base/$version/build";
  263.       if ($num != 1) {
  264.         warn "error unlinking $modules_base/$version/build";
  265.       } else {
  266.         if ($force_build_link || -d "/usr/src/linux-headers-$version") {
  267.           my $result = symlink ("/usr/src/linux-headers-$version",
  268.                                 "$modules_base/$version/build");
  269.           if (! $result) {
  270.             warn "Could not link /usr/src/linux-headers-$version to $modules_base/$version/build:$!"
  271.           }
  272.         }
  273.       }
  274.     }
  275.   }
  276. }
  277.  
  278. if ($relink_build_link || $force_build_link) {
  279.   &fix_build_link();
  280. }
  281. ######################################################################
  282. ## Fix the source link
  283. ######################################################################
  284. sub fix_source_link {
  285.   return unless -d "$modules_base/$version";
  286.   if ($relink_src_link) {
  287.     my $source_target;
  288.     my $real_target = '';
  289.  
  290.     if (-l "$modules_base/$version/source") {
  291.       $source_target = readlink "$modules_base/$version/source";
  292.     } else {
  293.       return;
  294.     }
  295.     # Determine what the real file name is, and test that for existence
  296.     $real_target = abs_path($source_target) if defined($source_target);
  297.     if (!defined($source_target) || ! -d "$real_target") { # Danglink link
  298.       warn qq(
  299.  Hmm. The package shipped with a symbolic link $modules_base/$version/source
  300.  However, I can not read the target: $!
  301.  Therefore, I am deleting $modules_base/$version/source\n
  302. );
  303.       my $num = unlink "$modules_base/$version/source";
  304.       if ($num != 1) {
  305.         warn "error unlinking $modules_base/$version/source";
  306.       }
  307.     }
  308.   }
  309. }
  310.  
  311. if ($relink_src_link) {
  312.   &fix_source_link();
  313. }
  314. ######################################################################
  315. ######################################################################
  316. ###########        Test whether a relative symlinkwould be OK #######
  317. ######################################################################
  318. ######################################################################
  319. sub test_relative {
  320.   my %params = @_;
  321.   my $cwd;
  322.  
  323.   die "Internal Error: Missing Required paramater 'Old Dir' "
  324.     unless $params{'Old Dir'};
  325.   die "Internal Error: Missing Required paramater New Dir' "
  326.     unless $params{'New Dir'};
  327.  
  328.  
  329.   die "Internal Error: No such dir $params{'Old Dir'} "
  330.     unless -d $params{'Old Dir'};
  331.   die "Internal Error: No such dir $params{'New Dir'} "
  332.     unless -d $params{'New Dir'};
  333.  
  334.   warn "Test relative: testing $params{'Old Dir'} -> $params{'New Dir'}"
  335.     if $DEBUG;
  336.   chomp($cwd = `pwd`);
  337.   chdir ($params{'New Dir'}) or die "Could not chdir to $params{'New Dir'}:$!";
  338.   my $ok = 0;
  339.   $params{'Old Dir'}  =~ s|^/*||o;
  340.   if (-d $params{'Old Dir'} ) {
  341.     if (defined $params{'Test File'}) {
  342.       if (-e $params{'Old Dir'} . $params{'Test File'}) {
  343.         $ok  = 1;
  344.       }
  345.     } else {
  346.       $ok = 1;                  # well, backward compatibility
  347.     }
  348.   }
  349.   chdir ($cwd) or die "Could not chdir to $params{'New Dir'}:$!";
  350.   return $ok;
  351. }
  352.  
  353. ######################################################################
  354. ######################################################################
  355. ############
  356. ######################################################################
  357. ######################################################################
  358. # sub CanonicalizePath {
  359. #   my $path = join '/', @_;
  360. #   my @work = split '/', $path;
  361. #   my @out;
  362. #   my $is_absolute;
  363.  
  364. #   if (@work && $work[0] eq "") {
  365. #     $is_absolute = 1; shift @work;
  366. #   }
  367.  
  368. #   while (@work) {
  369. #     my $seg = shift @work;
  370. #     if ($seg eq "." || $seg eq "") {
  371. #     } 
  372. #     elsif ($seg eq "..") {
  373. #       if (@out && $out[-1] ne "..") {
  374. #         pop @out;
  375. #       } 
  376. #       else {
  377. #         # Leading "..", or "../..", etc.
  378. #         push @out, $seg;
  379. #       }
  380. #     } 
  381. #     else {
  382. #       push @out, $seg;
  383. #     }
  384. #   }
  385.  
  386. #   unshift @out, "" if $is_absolute;
  387. #   return join('/', @out);
  388. # }
  389. ######################################################################
  390. ######################################################################
  391. ############
  392. ######################################################################
  393. ######################################################################
  394.  
  395. sub spath {
  396.   my %params = @_;
  397.  
  398.   die "Missing Required paramater 'Old'" unless $params{'Old'};
  399.   die "Missing Required paramater 'New'" unless  $params{'New'};
  400.  
  401.   my @olddir  = split '/', `readlink -q -m $params{'Old'}`;
  402.   my @newdir  = split '/', `readlink -q -m $params{'New'}`;
  403.   my @outdir  = @olddir;
  404.  
  405.   my $out = '';
  406.   my $i;
  407.   for ($i = 0; $i <= $#olddir && $i <= $#newdir; $i++) {
  408.     $out++ if ($olddir[$i] ne $newdir[$i]);
  409.     shift @outdir unless $out;
  410.     unshift @outdir, ".." if $out;
  411.   }
  412.   if ($#newdir > $#olddir) {
  413.     for ($i=0; $i < $#newdir; $i++) {
  414.       unshift @outdir, "..";
  415.     }
  416.   }
  417.   return join ('/', @outdir);
  418. }
  419. ######################################################################
  420. ######################################################################
  421. ############
  422. ######################################################################
  423. ######################################################################
  424.  
  425.  
  426. # This routine actually moves the kernel image
  427. # From: $realimageloc/$kimage-$version (/boot/vmlinuz-2.6.12)
  428. # To:   $image_dest/$kimage-$version   (/vmlinuz-2.6.12)
  429. # Note that the image is moved to a versioned destination, but ordinary
  430. # symlinks we create otherwise are not normally versioned
  431. sub really_move_image {
  432.   my $src_dir  = $_[0];
  433.   my $target   = $_[1];
  434.   my $dest_dir = $_[2];
  435.  
  436.   warn "Really move image: src_dir=$src_dir, target=$target,\n destdir=$dest_dir"
  437.     if $DEBUG;
  438.   if (-e "$target") {
  439.     # we should be in dir $dest_dir == $image_dest /, normally
  440.     rename("$target", "$target.$$") ||
  441.       die "failed to move " . $dest_dir . "$target:$!";
  442.     warn "mv $target $target.$$" if $DEBUG;
  443.   }
  444.   warn "mv -f $src_dir$target $target" if $DEBUG;
  445.   my $ret = system("mv -f " . $src_dir . "$target " .
  446.                    " $target");
  447.   if ($ret) {
  448.     die("Failed to move " . $src_dir . "$target to "
  449.         . $dest_dir . "$target.\n");
  450.   }
  451.   # Ok, now we may clobber the previous .old files
  452.   if (-e "$target.$$") {
  453.     rename("$target.$$", "$target.old") ||
  454.       die "failed to move " . $dest_dir . "$target:$!";
  455.     warn "mv $target.$$ $target " if $DEBUG;
  456.   }
  457. }
  458.  
  459. # Normally called after really_move_image; and only called if we asked for 
  460. # reversed link this routine reverses the symbolic link that is notmally 
  461. # created. Since the real kernel image has been moved over to 
  462. # $image_dest/$kimage-$version. So, this routine links
  463. # From:   $image_dest/$kimage-$version   (/vmlinuz-2.6.12)
  464. # To:     $realimageloc/$kimage-$version (/boot/vmlinuz-2.6.12)
  465. sub really_reverse_link {
  466.   my $src_dir    = $_[0];
  467.   my $link_name  = $_[1];
  468.   my $dest_dir   = $_[2];
  469.   warn "Really reverse link: src_dir=$src_dir, link name=$link_name\n" .
  470.     "\tdestdir=$dest_dir" if $DEBUG;
  471.  
  472.   my $Old = $dest_dir;
  473.   if (test_relative ('Old Dir' => $Old, 'New Dir' => $src_dir,
  474.                      'Test File' => "$link_name")) {
  475.     $Old   =~ s|^/*||o;
  476.   }
  477.   # Special case is they are in the same dir
  478.   my $rel_path = spath('Old' => "$Old", 'New' => "$src_dir" );
  479.   $Old ="" if $rel_path =~ m/^\s*$/o;
  480.  
  481.   if ($use_hard_links =~ m/YES/i) {
  482.     link($Old . "$link_name", $src_dir . "$link_name") ||
  483.       die("Failed to symbolic-link " . $dest_dir . "$link_name to " . $src_dir
  484.           . "$link_name .\n");
  485.     warn "ln " . $Old . "$link_name " . $src_dir . "$link_name"  if $DEBUG;
  486.   }
  487.   else {
  488.     symlink($Old . "$link_name", $src_dir . "$link_name") ||
  489.       die("Failed to link " . $dest_dir . "$link_name to " . $src_dir . 
  490.           "$link_name .\n");
  491.     warn "ln -s " . $Old . "$link_name " . $src_dir . "$link_name" if $DEBUG;
  492.   }
  493. }
  494.  
  495. # This routine is invoked if there is a symbolic link in place
  496. # in $image_dest/$kimage -- so a symlink exists in the destination.
  497. # What we are trying to determine is if we need to move the symbolic link over
  498. # to the the .old location
  499. sub move_p {
  500.   my $kimage     = $_[0];       # Name of the symbolic link
  501.   my $image_dest = $_[1];       # The directory the links goes into
  502.   my $image_name = $_[2]; 
  503.   my $src_dir    = $_[3]; 
  504.   my $force_move = 0;
  505.   warn "Move?: kimage=$kimage, image_dest=$image_dest, \n" .
  506.     "\timage_name=$image_name, src_dir=$src_dir" if $DEBUG;
  507.  
  508.   if ($no_symlink || $reverse_symlink) {
  509.     # we do not want links, yet we have a symbolic link here!
  510.     warn "found a symbolic link in " . $image_dest . "$kimage \n" .
  511.       "even though no_symlink is defined\n" if $no_symlink;
  512.     warn "found a symbolic link in " . $image_dest . "$kimage \n" .
  513.       "even though reverse_symlink is defined\n" if $reverse_symlink;
  514.     # make sure we change this state of affairs
  515.     $force_move = 1;
  516.     return $force_move;
  517.   }
  518.  
  519.   warn "DEBUG: OK. We found symlink, and we should have a symlink here.\n"
  520.     if $DEBUG;
  521.   my $vmlinuz_target = readlink "$kimage";
  522.   my $real_target = '';
  523.   my $target = `readlink -q -m "${realimageloc}${kimage-$version}"`;
  524.   $real_target = abs_path($vmlinuz_target) if defined($vmlinuz_target);
  525.  
  526.   if (!defined($vmlinuz_target) || ! -f "$real_target") {
  527.     # what, a dangling symlink?
  528.     warn "The link "  . $image_dest . "$kimage is a dangling link" .
  529.       "to $real_target\n";
  530.     $force_move = 1;
  531.     return $force_move;
  532.   }
  533.  
  534.  
  535.   warn "DEBUG: The link $kimage points to ($vmlinuz_target)\n" if $DEBUG;
  536.   warn "DEBUG: ($vmlinuz_target) is really ($real_target)\n" if $DEBUG;
  537.   my $cwd;
  538.   chomp ($cwd=`pwd`);
  539.   if ($vmlinuz_target !~ m|^/|o) {
  540.     $vmlinuz_target = $cwd . "/" . $vmlinuz_target;
  541.     $vmlinuz_target =~ s|/+|/|o;
  542.   }
  543.   $vmlinuz_target = `readlink -q -m $vmlinuz_target`;
  544.  
  545.   if ("$vmlinuz_target" ne "$target") {
  546.     warn "DEBUG: We need to handle this.\n" if $DEBUG;
  547.     if ($minimal_swap) {
  548.       warn "DEBUG: Minimal swap.\n" if $DEBUG;
  549.       if (-l "$kimage.old") {
  550.         warn "DEBUG: There is an old link at $kimage.old\n" if $DEBUG;
  551.         my $old_target = readlink "$kimage.old";
  552.         my $real_old_target = '';
  553.         $real_old_target=abs_path($old_target) if defined ($old_target);
  554.  
  555.         if ($real_old_target  && -f "$real_old_target") {
  556.           if ($old_target !~ m|^/|o) {
  557.             $old_target = $cwd . "/" . $old_target;
  558.             $old_target =~ s|/+|/|o;
  559.           }
  560.           $old_target = `readlink -q -m $old_target`;
  561.           if ("$old_target"  ne "$target") {
  562.             $force_move = 1;
  563.             warn "DEBUG: Old link ($old_target) does not point to us ($target)\n"
  564.               if $DEBUG;
  565.           } 
  566.           else {            # The .old points to the current
  567.             warn "$kimage.old --> $target -- doing nothing";
  568.             $force_move = 0;
  569.           }
  570.         } 
  571.         else { 
  572.           warn "DEBUG: Well, the old link does not exist -- so we move\n"
  573.             if $DEBUG;
  574.           $force_move = 1;
  575.         }
  576.       } 
  577.       else {
  578.         warn "DEBUG: No .old link -- OK to move\n"
  579.           if $DEBUG;
  580.         $force_move = 1;
  581.       }
  582.     } 
  583.     else {
  584.       warn "DEBUG: ok, minimal swap is no-- so we move.\n"
  585.         if $DEBUG;
  586.       $force_move = 1;
  587.     }
  588.   }
  589.   else {                  # already have proper link
  590.     warn "$kimage($vmlinuz_target) points to $target ($real_target) -- doing nothing";
  591.     $force_move = 0;
  592.   }
  593.   return $force_move;
  594. }
  595.  
  596.  
  597. # This routine moves the symbolic link around (/vmlinuz -> /vmlinuz.old)
  598. # It pays attention to whether we should the fact whether we should be using
  599. # hard links or not.
  600. sub really_move_link {
  601.   my $kimage     = $_[0];       # Name of the symbolic link
  602.   my $image_dest = $_[1];       # The directory the links goes into
  603.   my $image_name = $_[2]; 
  604.   my $src_dir    = $_[3]; 
  605.   warn "really_move_link: kimage=$kimage, image_dest=$image_dest\n" .
  606.     "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG;
  607.  
  608.   # don't clobber $kimage.old quite yet
  609.   rename("$kimage", "$kimage.$$") ||
  610.     die "failed to move " . $image_dest . "$kimage:$!";
  611.   warn "mv $kimage $kimage.$$" if $DEBUG;
  612.   my $Old = $src_dir;
  613.   my $cwd;
  614.  
  615.   chomp($cwd=`pwd`);
  616.   if (test_relative ('Old Dir' => $Old, 'New Dir' => $cwd,
  617.                      'Test File' => "$image_name")) {
  618.     $Old   =~ s|^/*||o;
  619.   }
  620.   # Special case is they are in the same dir
  621.   my $rel_path = spath('Old' => "$Old", 'New' => "$cwd" );
  622.   $Old ="" if $rel_path =~ m/^\s*$/o;
  623.  
  624.   if ($use_hard_links =~ m/YES/i) {
  625.     warn "ln ${Old}${image_name} $kimage" if $DEBUG;
  626.     if (! link("${Old}${image_name}", "$kimage")) {
  627.       rename("$kimage.$$", "$kimage");
  628.       die("Failed to link ${Old}${image_name} to " .
  629.           "${image_dest}${kimage}.\n");
  630.     }
  631.   } 
  632.   else {
  633.     warn "ln -s ${Old}${image_name} $kimage" if $DEBUG;
  634.     if (! symlink("${Old}${image_name}", "$kimage")) {
  635.       rename("$kimage.$$", "$kimage");
  636.       die("Failed to symbolic-link ${Old}${image_name} to " .
  637.           "${image_dest}${kimage}.\n");
  638.     }
  639.   }
  640.  
  641.   # Ok, now we may clobber the previous .old file
  642.   if (-l "$kimage.old" || ! -e "$kimage.old" ) {
  643.     rename("$kimage.$$", "$kimage.old");
  644.     warn "mv $kimage.$$ $kimage.old" if $DEBUG;
  645.   }
  646.   else {
  647.     warn "$kimage.old is not a symlink, not clobbering\n";
  648.     warn "rm $kimage.$$";
  649.     unlink "$kimage.$$" if $DEBUG;
  650.   }
  651. }
  652.  
  653. # This routine handles a request to do symlinks, but there is no
  654. # symlink file already there.  Either we are supposed to use copy, or we are
  655. # installing on a pristine system, or the user does not want symbolic links at
  656. # all.  We use a configuration file to tell the last two cases apart, creating
  657. # a config file if needed.
  658. sub handle_missing_link {
  659.   my $kimage     = $_[0];       # Name of the symbolic link
  660.   my $image_dest = $_[1];       # The directory the links goes into
  661.   my $image_name = $_[2]; 
  662.   my $src_dir    = $_[3]; 
  663.   warn "handle_missing_link: kimage=$kimage, image_dest=$image_dest\n" .
  664.     "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG;
  665.  
  666.   if ($no_symlink) {
  667.     warn "cp -a --backup=t $realimageloc$image_name $kimage" if $DEBUG;
  668.     my $ret = system("cp -a --backup=t " . $realimageloc .
  669.                      "$image_name "   . " $kimage");
  670.     if ($ret) {
  671.       die("Failed to copy " . $realimageloc . "$image_name to "
  672.           . $image_dest . "$kimage .\n");
  673.     }
  674.   } 
  675.   elsif ($reverse_symlink) {
  676.     warn "mv -f $realimageloc$image_name $kimage" if $DEBUG;
  677.     my $ret = system("mv -f " . $realimageloc . "$image_name "
  678.                      . "$kimage");
  679.     if ($ret) {
  680.       die("Failed to move " . $realimageloc . "$image_name to "
  681.           . $image_dest . "$kimage .\n");
  682.     }
  683.   } 
  684.   else {
  685.     if (! $have_conffile) {
  686.       my $ret;
  687.       my $answer='';
  688.       $do_symlink = "Yes";
  689.       my $question = "${package_name}/postinst/create-kimage-link-$version";
  690.  
  691.       ($ret,$answer) = get("$question");
  692.       die "Error retreiving answer for $question: $answer" if $ret;
  693.  
  694.       $answer =~ s/^\s+//;
  695.       $answer =~ s/\s+$//;
  696.       $do_symlink = "No" if $answer =~ /^(f|n)/i;
  697.         
  698.       if (open(CONF, ">$CONF_LOC")) {
  699.         print CONF "# Kernel Image management overrides\n";
  700.         print CONF "# See kernel-img.conf(5) for details\n";
  701.         if ($loader =~ /palo/i) {
  702.           print CONF "link_in_boot = Yes\n";
  703.           print CONF "do_symlinks = Yes\n";
  704.           print CONF "relative_links = Yes\n";
  705.           print CONF "do_bootloader = No\n";
  706.         } else {
  707.           print CONF "do_symlinks = $do_symlink\n";
  708.         }
  709.         close CONF;
  710.       }
  711.       $have_conffile = "Yes";
  712.     }
  713.   }
  714.  
  715.   if (! $no_symlink && $do_symlink =~ /Yes/i) {
  716.     my $Old = $realimageloc;
  717.     my $New = $image_dest;
  718.     my $Name = "$image_name";
  719.     my $Link_Dest = "$kimage";
  720.  
  721.     if ($reverse_symlink) {
  722.       $Old = $image_dest;
  723.       $New = $realimageloc;
  724.       $Name = "$kimage";
  725.       $Link_Dest = $realimageloc . "$image_name";
  726.     }
  727.     if (test_relative ('Old Dir' => $Old,
  728.                        'New Dir' => $New,
  729.                        'Test File' => $Name)) {
  730.       $Old   =~ s|^/*||o;
  731.     }
  732.     # Special case is they are in the same dir
  733.     my $rel_path = spath('Old' => "$Old", 'New' => "$New" );
  734.     $Old ="" if $rel_path =~ m/^\s*$/o;
  735.  
  736.     symlink($Old . "$Name", "$Link_Dest") ||
  737.       die("Failed to symbolic-link ${Old}$Name to $Link_Dest.\n");
  738.     warn "ln -s ${Old}$Name $Link_Dest" if $DEBUG;
  739.  
  740.   }
  741. }
  742.  
  743. # This routine handles the rest of the cases, where the user has requested 
  744. # non-traditional handling, like using cp, or reverse symlinks, or hard links.
  745. sub handle_non_symlinks {
  746.   my $kimage     = $_[0];       # Name of the symbolic link
  747.   my $image_dest = $_[1];       # The directory the links goes into
  748.   my $image_name = $_[2]; 
  749.   my $src_dir    = $_[3]; 
  750.   warn "handle_non_link: kimage=$kimage, image_dest=$image_dest\n" .
  751.     "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG;
  752.  
  753.   # Save the current image. We do this in all four cases
  754.   rename("$kimage", "$kimage.$$") || 
  755.     die "failed to move " . $image_dest . "$kimage:$!";
  756.   warn "mv $kimage $kimage.$$" if $DEBUG;
  757.  
  758.   ##,#### 
  759.   # case One
  760.   #`####
  761.   if ($no_symlink) {
  762.     # Maybe /$image_dest is on a dos system?
  763.     warn "cp -a --backup=t $realimageloc$image_name $kimage" if $DEBUG;
  764.     my $ret = system("cp -a --backup=t " . $realimageloc
  765.                      . "$image_name " . "$kimage");
  766.     if ($ret) {
  767.       if (-e "$kimage.$$") {
  768.         rename("$kimage.$$", "$kimage");
  769.         warn "mv $kimage.$$ $kimage" if $DEBUG;
  770.       }
  771.       die("Failed to copy " . $realimageloc . "$image_name to "
  772.           . $image_dest . "$kimage .\n");
  773.     }
  774.   }
  775.   ##,#### 
  776.   # case Two
  777.   #`####
  778.   elsif ($reverse_symlink) {  # Maybe /$image_dest is on a dos system?
  779.     warn "mv -f  $realimageloc$image_name $kimage" if $DEBUG;
  780.     my $ret = system("mv -f " . $realimageloc . "$image_name "
  781.                      . $image_dest . "$kimage");
  782.     if ($ret) {
  783.       if (-e "$kimage.$$") {
  784.         rename("$kimage.$$", "$kimage");
  785.         warn "mv $kimage.$$ $kimage" if $DEBUG;
  786.       }
  787.       die("Failed to move " . $realimageloc . "$image_name to "
  788.           . $image_dest . "$kimage .\n");
  789.     }
  790.     my $Old = $image_dest;
  791.     if (test_relative ('Old Dir' => $Old, 'New Dir' => $realimageloc,
  792.                        'Test File' => "$kimage")) {
  793.       $Old   =~ s|^/*||o;
  794.     }
  795.     # Special case is they are in the same dir
  796.     my $rel_path = spath('Old' => "$Old", 'New' => "$realimageloc" );
  797.     $Old ="" if $rel_path =~ m/^\s*$/o;
  798.  
  799.     if ($use_hard_links =~ m/YES/i) {
  800.       warn "ln " . $Old . "$kimage " . $realimageloc . "$image_name" if $DEBUG;
  801.       if (! link($Old . "$kimage", $realimageloc . "$image_name")) {
  802.         warn "Could not link " . $image_dest .
  803.           "$kimage to $image_name :$!";
  804.       }
  805.     }
  806.     else {
  807.       warn "ln -s " . $Old . "$kimage " . $realimageloc . "$image_name" if $DEBUG;
  808.       if (! symlink($Old . "$kimage", $realimageloc . "$image_name")) {
  809.         warn "Could not symlink " . $image_dest .
  810.           "$kimage to $image_name :$!";
  811.       }
  812.     }
  813.   }
  814.   ##,####
  815.   # case Three
  816.   #`####
  817.   elsif ($use_hard_links =~ m/YES/i ) {
  818.     # Ok then. this ought to be a hard link, and hence fair game
  819.     # don't clobber $kimage.old quite yet
  820.     my $Old = $realimageloc;
  821.     my $cwd;
  822.     chomp($cwd=`pwd`);
  823.     if (test_relative ('Old Dir' => $Old, 'New Dir' => $cwd,
  824.                        'Test File' => "$image_name")) {
  825.       $Old   =~ s|^/*||o;
  826.     }
  827.     # Special case is they are in the same dir
  828.     my $rel_path = spath('Old' => "$Old", 'New' => "$cwd" );
  829.     $Old ="" if $rel_path =~ m/^\s*$/o;
  830.  
  831.     warn "ln " . $Old . "$image_name " . "$kimage" if $DEBUG;
  832.     if (! link($Old . "$image_name", "$kimage")) {
  833.       warn "mv $kimage.$$ $kimage" if $DEBUG;
  834.       rename("$kimage.$$", "$kimage");
  835.       die("Failed to link " . $realimageloc . "$image_name to "
  836.           . $image_dest . "$kimage .\n");
  837.     }
  838.   }
  839.   ##,####
  840.   # case Four
  841.   #`####
  842.   else {
  843.     # We just use cp
  844.     warn "cp -a --backup=t $realimageloc$image_name $kimage" if $DEBUG;
  845.     my $ret = system("cp -a --backup=t " . $realimageloc
  846.                      . "$image_name " . "$kimage");
  847.     if ($ret) {
  848.       if (-e "$kimage.$$") {
  849.         warn "mv $kimage.$$ $kimage" if $DEBUG;
  850.         rename("$kimage.$$", "$kimage");
  851.       }
  852.       die("Failed to copy " . $realimageloc . "$image_name to "
  853.           . $image_dest . "$kimage .\n");
  854.     }
  855.   }
  856.   # Ok, now we may clobber the previous .old file
  857.   warn "mv $kimage.$$ $kimage.old if -e $kimage.$$" if $DEBUG;
  858.   rename("$kimage.$$", "$kimage.old") if -e "$kimage.$$";
  859. }
  860.  
  861. # This routine is responsible for setting up the symbolic links
  862. # So, the actual kernel image lives in
  863. # $realimageloc/$image_name (/boot/vmlinuz-2.6.12).
  864. # This routine creates symbolic links in $image_dest/$kimage (/vmlinuz)
  865. sub image_magic {
  866.   my $kimage     = $_[0];       # Name of the symbolic link
  867.   my $image_dest = $_[1];       # The directory the links goes into
  868.   my $image_name = "$kimage-$version";
  869.   my $src_dir    = $realimageloc;
  870.   warn "image_magic: kimage=$kimage, image_dest=$image_dest\n" .
  871.     "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG;
  872.  
  873.   # Well, in any case, if the destination (the symlink we are trying
  874.   # to create) is a directory, we should do nothing, except throw a
  875.   # diagnostic.
  876.   if (-d "$kimage" ) {
  877.     die ("Hmm. $kimage is a directory, which I did not expect.  I am\n" .
  878.          "trying to create a symbolic link with that name linked to \n" .
  879.          "$image_dest . Since a directory exists here, my assumptions \n" .
  880.          "are way off, and I am aborting.\n" );
  881.     exit (3);
  882.   }
  883.  
  884.   if ($move_image) {   # Maybe $image_dest is in on dos, or something?
  885.     #                   source dir,    link name,        dest dir
  886.     really_move_image(  $realimageloc, $image_name, $image_dest);
  887.     really_reverse_link($realimageloc, $image_name, $image_dest)
  888.       if $reverse_symlink;
  889.     return;
  890.   }
  891.  
  892.   if (-l "$kimage") {           # There is a symbolic link
  893.     warn "DEBUG: There is a symlink for $kimage\n" if $DEBUG;
  894.     my $force_move = move_p($kimage, $image_dest, $image_name, $src_dir);
  895.  
  896.     if ($force_move) {
  897.       really_move_link($kimage, $image_dest, $image_name, $src_dir);
  898.     }
  899.   }
  900.   elsif (! -e "$kimage") {
  901.     # Hmm. Pristine system? How can that be? Installing from scratch?
  902.     # Or maybe the user does not want a symbolic link here.
  903.     # Possibly they do not want a link here. (we should be in /
  904.     # here[$image_dest, really]
  905.     handle_missing_link($kimage, $image_dest, $image_name, $src_dir);
  906.   }
  907.   elsif (-e "$kimage" ) {
  908.     # OK, $kimage exists -- but is not a link
  909.     handle_non_symlinks($kimage, $image_dest, $image_name, $src_dir);
  910.   }
  911. }
  912.  
  913. ######################################################################
  914. ######################################################################
  915. ######################################################################
  916. ######################################################################
  917.  
  918. # We may not have any modules installed
  919. if ( -d "$modules_base/$version" ) {
  920.   print STDERR "Running depmod.\n";
  921.   my $ret = system("depmod -a -F $realimageloc/System.map-$version $version");
  922.   my $exit_value  = $? >> 8;
  923.   my $signal_num  = $? & 127;
  924.   my $dumped_core = $? & 128;
  925.   if ($ret) {
  926.     if ( -f "$modules_base/$version/modules.dep") {
  927.       unlink "$modules_base/$version/modules.dep" unless $initrd;
  928.     }
  929.     my $seen;
  930.     my $answer;
  931.     my $question = "${package_name}/postinst/depmod-error-$version";
  932.     if ($initrd) {
  933.       $question = "${package_name}/postinst/depmod-error-initrd-$version";
  934.     }
  935.     ($ret,$seen) = fset ("$question", 'seen', 'false');
  936.     die "Error setting debconf flags in $question: $seen" if $ret;
  937.  
  938.     $ret = subst("$question", 'modules_base', "$modules_base");
  939.     die "Error setting debconf substitutions in $question: $seen" if $ret;
  940.  
  941.     $ret = subst("$question", 'SIGNAL', ", and got a signal $signal_num");
  942.     die "Error setting debconf substitutions in $question: $seen" if $ret;
  943.  
  944.     if ($dumped_core) {
  945.       $ret = subst("$question", 'CORE', ", and dumped core");
  946.       die "Error setting debconf substitutions in $question: $seen" if $ret;
  947.     }
  948.     else {
  949.       $ret = subst("$question", 'CORE', " ");
  950.       die "Error setting debconf substitutions in $question: $seen" if $ret;
  951.     }
  952.  
  953.     ($ret,$seen) = input('medium', "$question");
  954.     if ($ret && $ret != 30 ) {
  955.       die "Error setting debconf question $question: $seen";
  956.     }
  957.  
  958.     ($ret,$seen) = go ();
  959.     if ($ret && $ret != 30 ) {
  960.       die "Error asking debconf question $question: $seen";
  961.     }
  962.  
  963.     ($ret,$answer) = get("$question");
  964.     die "Error retreiving answer for $question: $answer" if $ret;
  965.  
  966.     if (! $ignore_depmod_err) {
  967.       if ($answer =~ /^(y|t)/i) {
  968.         exit(1);
  969.       }
  970.       else {
  971.         print STDERR "Ok, continuing as directed\n";
  972.       }
  973.     }
  974.   }
  975. }
  976.  
  977.  
  978.  
  979. sub find_initrd_tool {
  980.   my $hostversion = shift;
  981.   my $version = shift;
  982.   print STDERR "Finding valid ramdisk creators.\n";
  983.   my @ramdisks =
  984.     grep {
  985.       my $args = 
  986.         "$_ " .
  987.           "--supported-host-version=$hostversion " .
  988.             "--supported-target-version=$version " .
  989.               "1>/dev/null 2>&1"
  990.                 ;
  991.       system($args) == 0;
  992.     }
  993.       split (/[:,\s]+/, $ramdisk);
  994. }
  995.  
  996. # The initrd symlink should probably be in the same dir that the
  997. # symlinks are in
  998. if ($initrd) {
  999.   my $success = 0;
  1000.  
  1001.   # Update-initramfs is called slightly different than mkinitrd and
  1002.   # mkinitramfs. XXX It should really be made compatible with this stuff
  1003.   # some how.
  1004.   if ($ramdisk eq $update_initramfs) {
  1005.     my $upgrading = 1;
  1006.     if (! defined $ARGV[1] || ! $ARGV[1] || $ARGV[1] =~ m/<unknown>/og) {
  1007.       $upgrading = 0;
  1008.     }
  1009.     my $ret = system("$ramdisk " . ($upgrading ? "-u" : "-c") . " -k " . $version . " >&2");
  1010.     $success = 1 unless $ret;
  1011.   } else {
  1012.   # XXX: Start non-indented
  1013.   chomp (my $hostversion = `uname -r`);
  1014.   my @ramdisklist;
  1015.   @ramdisklist = find_initrd_tool($hostversion, $version, $ramdisk) if $ramdisk;
  1016.   die "Failed to find suitable ramdisk generation tool for kernel version \n" .
  1017.     "$version on running kernel $hostversion in $ramdisk\n"
  1018.       if $#ramdisklist < 0;
  1019.  
  1020.   for $ramdisk_cmd (@ramdisklist) {
  1021.     print STDERR "Using $ramdisk_cmd to build the ramdisk.\n";
  1022.     print STDERR "Other valid candidates: @ramdisklist\n" if $#ramdisklist > 0;
  1023.  
  1024.     my $initrd_path = $realimageloc . "initrd.img-$version";
  1025.     my $ret = system("$ramdisk_cmd " .
  1026.                      ($mkimage ? "-m '$mkimage' " : "") .
  1027.                      "-o $initrd_path.new $modules_base/$version");
  1028.     if ($ret) {
  1029.       warn "$ramdisk_cmd failed to create initrd image.\n";
  1030.     }
  1031.     else {
  1032.       rename("$initrd_path.new", "$initrd_path")
  1033.         or die("Failed to rename initrd ($initrd_path)\n");
  1034.       $success = 1;
  1035.       last;
  1036.     }
  1037.   }
  1038.   # XXX: End non-idented
  1039.   }
  1040.   die "Failed to create initrd image.\n" unless $success;
  1041.   if (! defined $ARGV[1] || ! $ARGV[1] || $ARGV[1] =~ m/<unknown>/og) {
  1042.     image_magic("initrd.img", $image_dest);
  1043.   }
  1044.   else {
  1045.     if (! -e "initrd.img") {
  1046.       handle_missing_link("initrd.img", $image_dest, "initrd.img-$version",
  1047.                           $realimageloc);
  1048.     }
  1049.     else {
  1050.       print STDERR
  1051.         "Not updating initrd symbolic links since we are being updated/reinstalled \n";
  1052.       print STDERR
  1053.         "($ARGV[1] was configured last, according to dpkg)\n";
  1054.     }
  1055.   }
  1056.  
  1057.   if ($initrd && -l "initrd" ) {
  1058.     my $ret;
  1059.     my $seen;
  1060.     my $answer;
  1061.     my $question = "${package_name}/postinst/old-initrd-link-$version";
  1062.  
  1063.     ($ret,$answer) = get("$question");
  1064.     die "Error retreiving answer for $question: $answer" if $ret;
  1065.  
  1066.     $answer =~ s/^\s+//;
  1067.     $answer =~ s/\s+$//;
  1068.     if ($answer =~ /^(y|t)/i) {
  1069.       unlink "initrd";
  1070.     }
  1071.   }
  1072.  
  1073.   if ($initrd && -l "$image_dir/initrd" && ! $link_in_boot) {
  1074.     my $ret;
  1075.     my $seen;
  1076.     my $answer;
  1077.     my $question = "${package_name}/postinst/old-dir-initrd-link-$version";
  1078.  
  1079.     ($ret,$answer) = get("$question");
  1080.     die "Error retreiving answer for $question: $answer" if $ret;
  1081.  
  1082.     $answer =~ s/^\s+//;
  1083.     $answer =~ s/\s+$//;
  1084.     if ($answer =~ /^(y|t)/i) {
  1085.       unlink "$image_dir/initrd";
  1086.     }
  1087.   }
  1088. }
  1089. else {                        # Not making an initrd emage
  1090.   if (-l "initrd.img") {
  1091.     # Ooh, last image was an initrd image? in any case, we should move it. 
  1092.     my $target = readlink "initrd.img";
  1093.     my $real_target = '';
  1094.     $real_target = abs_path($target) if defined ($target);
  1095.  
  1096.     if (!defined($target) || ! -f "$real_target") {
  1097.       # Eh. dangling link. can safely be removed.
  1098.       unlink("initrd.img");
  1099.     } else {
  1100.       if (-l "initrd.img.old" || ! -e "initrd.img.old" ) {
  1101.         rename("initrd.img", "initrd.img.old");
  1102.       } else {
  1103.         warn "initrd.img.old is not a symlink, not clobbering\n";
  1104.         unlink("initrd.img");
  1105.       }
  1106.     }
  1107.   }
  1108. }
  1109.  
  1110. # Warn of a reboot
  1111. if (-x $notifier) {
  1112.   system($notifier);
  1113. }
  1114.  
  1115. # Let programs know not to hibernate if the kernel that would be used for
  1116. # resume-from-hibernate is likely to differ from the currently running kernel.
  1117. system("mountpoint -q /var/run");
  1118. if ($? eq 0) {
  1119.     system("touch /var/run/do-not-hibernate");
  1120. }
  1121.  
  1122. # Only change the symlinks if we are not being upgraded
  1123. if (! defined $ARGV[1] || ! $ARGV[1] || $ARGV[1] =~ m/<unknown>/og) {
  1124.   image_magic($kimage, $image_dest);
  1125. }
  1126. else {
  1127.   if (! -e "$kimage") {
  1128.     handle_missing_link($kimage, $image_dest, "$kimage-$version", 
  1129.                         $realimageloc);
  1130.   }
  1131.   else {
  1132.     print STDERR
  1133.       "Not updating image symbolic links since we are being updated/reinstalled \n";
  1134.     print STDERR
  1135.       "($ARGV[1] was configured last, according to dpkg)\n";
  1136.   }
  1137. }
  1138.  
  1139. # We used to have System.* files in /
  1140. if (-e "/System.map" || -e "/System.old") {
  1141.   my $ret;
  1142.   my $answer;
  1143.   my $question = "${package_name}/postinst/old-system-map-link-$version";
  1144.  
  1145.   ($ret,$answer) = get("$question");
  1146.   die "Error retreiving answer for $question: $answer" if $ret;
  1147.  
  1148.   $answer =~ s/^\s+//;
  1149.   $answer =~ s/\s+$//;
  1150.   if ($answer =~ /^(y|t)/i) {
  1151.     unlink '/System.map' if -e '/System.map';
  1152.     unlink '/System.old' if -e '/System.old';
  1153.     print STDERR "Obsolete links removed.\n";
  1154.   }
  1155. }
  1156.  
  1157. # creating some info about kernel and initrd
  1158. if ($DEBUG) {
  1159.   my $ksize=sprintf("%.0f",(stat($realimageloc .
  1160.                                  "$kimage-$version"))[7]/1024)."kB";
  1161.   my $initrdsize='';
  1162.   if ($initrd) {
  1163.     $initrdsize=sprintf("%.0f",(stat($realimageloc .
  1164.                                      "initrd.img-$version"))[7]/1024)."kB";
  1165.   }
  1166.  
  1167.   print STDERR <<"EOMSG";
  1168. A new kernel image has been installed at $realimageloc$kimage-$version
  1169.  (Size: $ksize)
  1170.  
  1171. Symbolic links, unless otherwise specified, can be found in $image_dest
  1172.  
  1173. EOMSG
  1174.   ;
  1175.  
  1176.   if ($initrd) {
  1177.     print STDERR <<"EOMSGA";
  1178.  
  1179.  Initial rootdisk image: ${realimageloc}initrd.img-$version (Size: $initrdsize)
  1180. EOMSGA
  1181.     ;
  1182.   }
  1183. }
  1184.  
  1185. # set the env var stem
  1186. $ENV{'STEM'} = "linux";
  1187. sub exec_script {
  1188.   my $type   = shift;
  1189.   my $script = shift;
  1190.   print STDERR "Running $type hook script $script.\n";
  1191.   system ("$script $version $realimageloc$kimage-$version") &&
  1192.     print STDERR "User $type hook script [$script] ";
  1193.   if ($?) {
  1194.     if ($? == -1) {
  1195.       print STDERR "failed to execute: $!\n";
  1196.     }
  1197.     elsif ($? & 127) {
  1198.       printf STDERR "died with signal %d, %s coredump\n",
  1199.         ($? & 127),  ($? & 128) ? 'with' : 'without';
  1200.     }
  1201.     else {
  1202.       printf STDERR "exited with value %d\n", $? >> 8;
  1203.     }
  1204.     exit $? >> 8;
  1205.   }
  1206. }
  1207. sub run_hook {
  1208.   my $type   = shift;
  1209.   my $script = shift;
  1210.   if ($script =~ m,^/,) {
  1211.     # Full path provided for the hook script
  1212.     if (-x "$script") {
  1213.       &exec_script($type,$script);
  1214.     }
  1215.     else {
  1216.       die "The provided $type hook script [$script] could not be run.\n";
  1217.     }
  1218.   }
  1219.   else {
  1220.     # Look for it in a safe path
  1221.     for my $path ('/bin', '/sbin', '/usr/bin', '/usr/sbin') {
  1222.       if (-x "$path/$script") {
  1223.         &exec_script($type, "$path/$script");
  1224.         return 0;
  1225.       }
  1226.     }
  1227.     # No luck
  1228.     print STDERR "Could not find $type hook script [$script].\n";
  1229.     die "Looked in: '/bin', '/sbin', '/usr/bin', '/usr/sbin'\n";
  1230.   }
  1231. }
  1232.  
  1233. ## Run user hook script here, if any
  1234. if ($postinst_hook) {
  1235.   &run_hook("postinst", $postinst_hook);
  1236. }
  1237.  
  1238. if (-d "/etc/kernel/postinst.d") {
  1239.   print STDERR "Examining /etc/kernel/postinst.d.\n";
  1240.   system ("run-parts --verbose --exit-on-error --arg=$version " .
  1241.           "--arg=$realimageloc$kimage-$version " .
  1242.           "/etc/kernel/postinst.d") &&
  1243.             die "Failed to process /etc/kernel/postinst.d";
  1244. }
  1245.  
  1246. if (-d "/etc/kernel/postinst.d/$version") {
  1247.   print STDERR "Examining /etc/kernel/postinst.d/$version.\n";
  1248.   system ("run-parts --verbose --exit-on-error --arg=$version " .
  1249.           "--arg=$realimageloc$kimage-$version " .
  1250.           "/etc/kernel/postinst.d/$version") &&
  1251.             die "Failed to process /etc/kernel/postinst.d/$version";
  1252. }
  1253.  
  1254. LOADER: {
  1255.   last unless $do_boot_enable; # Exit if explicitly asked to
  1256.  
  1257.   last if $loader =~ /silo/i; # SILO does not have to be executed.
  1258.   last if $loader =~ /yaboot/i; # yaboot does not have to be executed.
  1259.   last if $loader =~ /milo/i; # MILO does not have to be executed.
  1260.   last if $loader =~ /nettrom/i; # NETTROM does not have to be executed.
  1261.   last if $loader =~ /arcboot/i; # ARCBOOT does not have to be executed.
  1262.   last if $loader =~ /delo/i; # DELO does not have to be executed.
  1263.   if ($official_image =~ /^\s*YES\s*$/o) {
  1264.     last if $loader =~ /quik/i; # maintainer asked quik invocation to be ignored
  1265.   }
  1266.  
  1267.   last unless $loaderloc;
  1268.   last unless -x $loaderloc;
  1269.   last unless $do_bootloader;
  1270.  
  1271.   if (-T "/etc/$loader.conf") {
  1272.     # Trust and use the existing lilo.conf.
  1273.     print STDERR "You already have a $Loader configuration in /etc/$loader.conf\n";
  1274.     my $ret = &run_lilo();
  1275.     exit $ret if $ret;
  1276.   }
  1277. }
  1278.  
  1279.  
  1280. sub run_lilo (){
  1281.   my $ret;
  1282.   # Try and figure out if the user really wants lilo to be run --
  1283.   # since the default is to run the boot laoder, which is ! grub -- but
  1284.   # the user may be using grub now, and not changed the default.
  1285.  
  1286.   # So, if the user has explicitly asked for the loader to be run, or
  1287.   # if there is no postinst hook, or if there is no grub installed --
  1288.   # we are OK. Or else, we ask.
  1289.   if ($explicit_do_loader || (! ($postinst_hook && -x '/sbin/grub')))  {
  1290.     print STDERR "Running boot loader as requested\n";
  1291.   }
  1292.   else {
  1293.     # Ask the user
  1294.     my $seen;
  1295.     my $question = "shared/kernel-image/really-run-bootloader";
  1296.  
  1297.     print STDERR "Do we really want to run bootloader $loader?\n";
  1298.  
  1299.     ($ret,$seen) = fset ("$question", 'seen', 'false');
  1300.     die "Error setting debconf flags in $question: $seen" if $ret;
  1301.  
  1302.     $ret = subst("$question", 'loader', "$loader");
  1303.     die "Error setting debconf substitutions in $question: $seen" if $ret;
  1304.  
  1305.     ($ret,$seen) = input('critical', "$question");
  1306.     if ($ret && $ret != 30 ) {
  1307.       die "Error setting debconf question $question: $seen";
  1308.     }
  1309.  
  1310.     ($ret,$seen) = go ();
  1311.     if ($ret && $ret != 30 ) {
  1312.       die "Error asking debconf question $question: $seen";
  1313.     }
  1314.  
  1315.     ($ret,$answer) = get("$question");
  1316.     die "Error retreiving answer for $question: $answer" if $ret;
  1317.  
  1318.     if ($answer =~ /^(y|t)/i) {
  1319.       print STDERR "Ok, not running $loader\n";
  1320.       return 0;
  1321.     }
  1322.     else {
  1323.       print STDERR "Ok, continuing as directed.\n";
  1324.     }
  1325.  
  1326.   }
  1327.   if ($loader =~ /^lilo/io or $loader =~ /vmelilo/io) {
  1328.     print STDERR "Testing $loader.conf ... \n";
  1329.     unlink $temp_file_name;     # security
  1330.     $ret = system("$loaderloc -t >$temp_file_name 2>&1");
  1331.     if ($ret) {
  1332.       my $seen;
  1333.       my $note = "${package_name}/postinst/bootloader-test-error-$version";
  1334.  
  1335.       print STDERR "Failed test for bootloader $loader\n";
  1336.  
  1337.       ($ret,$seen) = fset ("$note", 'seen', 'false');
  1338.       die "Error setting debconf flags in $note: $seen" if $ret;
  1339.  
  1340.       $ret = subst("$note", 'loader', "$loader");
  1341.       die "Error setting debconf substitutions in $note: $seen" if $ret;
  1342.  
  1343.       $ret = subst("$note", 'temp_file_name', "$temp_file_name");
  1344.       die "Error setting debconf substitutions in $note: $seen" if $ret;
  1345.  
  1346.       ($ret,$seen) = input('critical', "$note");
  1347.       if ($ret && $ret != 30 ) {
  1348.         die "Error setting debconf note $note: $seen";
  1349.       }
  1350.  
  1351.       ($ret,$seen) = go ();
  1352.       if ($ret && $ret != 30 ) {
  1353.         die "Error showing debconf note $note: $seen";
  1354.       }
  1355.       return $ret;
  1356.     }
  1357.     unlink "$temp_file_name";
  1358.     print STDERR "Testing successful.\n";
  1359.     print STDERR "Installing the ";
  1360.     print STDERR "partition " if $loader =~ /^lilo/io;
  1361.     print STDERR "boot sector... \n";
  1362.   }
  1363.  
  1364.   print STDERR "Running $loaderloc  ... \n";
  1365.   if ($loader =~ /^elilo/io) {
  1366.     $ret = system("$loaderloc 2>&1 | tee $temp_file_name");
  1367.   } else {
  1368.     $ret = system("$loaderloc >$temp_file_name 2>&1");
  1369.   }
  1370.   if ($ret) {
  1371.     my $ret;
  1372.     my $seen;
  1373.     my $note = "${package_name}/postinst/bootloader-error-$version";
  1374.  
  1375.     ($ret,$seen) = fset ("$note", 'seen', 'false');
  1376.     die "Error setting debconf flags in $note: $seen" if $ret;
  1377.  
  1378.     $ret = subst("$note", 'locader', "$loader");
  1379.     die "Error setting debconf substitutions in $note: $seen" if $ret;
  1380.  
  1381.     $ret = subst("$note", 'temp_file_name', "$temp_file_name");
  1382.     die "Error setting debconf substitutions in $note: $seen" if $ret;
  1383.  
  1384.     ($ret,$seen) = input('critical', "$note");
  1385.     if ($ret && $ret != 30 ) {
  1386.       die "Error setting debconf note $note: $seen";
  1387.     }
  1388.  
  1389.     ($ret,$seen) = go ();
  1390.     if ($ret && $ret != 30 ) {
  1391.       die "Error asking debconf question $note: $seen";
  1392.     }
  1393.     return $ret;
  1394.   }
  1395.   unlink $temp_file_name;
  1396.   print STDERR "Installation successful.\n";
  1397.   return 0;
  1398. }
  1399.  
  1400. exit 0;
  1401.  
  1402. __END__
  1403.  
  1404.